﻿
using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.ДокументыСсылка;
using V82.ДокументыОбъект;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.ДокументыОбъект
{
	///<summary>
	///(Регл)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class НачислениеОтпускаРаботникамОрганизаций:ДокументОбъект
	{
		public bool _ЭтоНовый;
		public bool ЭтоНовый()
		{
			return _ЭтоНовый;
		}
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		[DataMember]
		[ProtoMember(3)]
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		[DataMember]
		[ProtoMember(4)]
		public bool ПометкаУдаления {get;set;}
		[DataMember]
		[ProtoMember(5)]
		public DateTime Дата {get;set;}
		[DataMember]
		[ProtoMember(6)]
		public DateTime ПрефиксНомера {get;set;}
		[DataMember]
		[ProtoMember(7)]
		public string/*11*/ Номер {get;set;}
		[DataMember]
		[ProtoMember(8)]
		public bool Проведен {get;set;}
		[DataMember]
		[ProtoMember(9)]
		public DateTime ПериодРегистрации {get;set;}//Период регистрации
		[DataMember]
		[ProtoMember(10)]
		public V82.СправочникиСсылка.Организации Организация {get;set;}
		///<summary>
		///Любая дополнительная информация
		///</summary>
		[DataMember]
		[ProtoMember(11)]
		public string/*(0)*/ Комментарий {get;set;}
		[DataMember]
		[ProtoMember(12)]
		public V82.СправочникиСсылка.Пользователи Ответственный {get;set;}
		[DataMember]
		[ProtoMember(13)]
		public V82.СправочникиСсылка.СотрудникиОрганизаций Сотрудник {get;set;}
		[DataMember]
		[ProtoMember(14)]
		public V82.СправочникиСсылка.ФизическиеЛица Физлицо {get;set;}//Физическое лицо
		///<summary>
		///Дата начала события, оплачиваемого по среднему заработку
		///</summary>
		[DataMember]
		[ProtoMember(15)]
		public DateTime ДатаНачалаСобытия {get;set;}//Дата начала события
		[DataMember]
		[ProtoMember(16)]
		public DateTime ДатаНачалаОсновногоОтпуска {get;set;}//Дата начала основного отпуска
		[DataMember]
		[ProtoMember(17)]
		public DateTime ДатаОкончанияОсновногоОтпуска {get;set;}//Дата окончания основного отпуска
		[DataMember]
		[ProtoMember(18)]
		public decimal/*(3)*/ КоличествоДнейОсновногоОтпуска {get;set;}//Количество дней основного отпуска
		[DataMember]
		[ProtoMember(19)]
		public V82.Перечисления/*Ссылка*/.ПорядокРасчетаОтпуска ПорядокРасчетаОсновногоОтпуска {get;set;}//Порядок расчета основного отпуска
		[DataMember]
		[ProtoMember(20)]
		public DateTime ДатаНачалаДополнительногоОтпуска {get;set;}//Дата начала дополнительного отпуска
		[DataMember]
		[ProtoMember(21)]
		public DateTime ДатаОкончанияДополнительногоОтпуска {get;set;}
		[DataMember]
		[ProtoMember(22)]
		public decimal/*(3)*/ КоличествоДнейДополнительногоОтпуска {get;set;}//Дней дополнительного отпуска
		[DataMember]
		[ProtoMember(23)]
		public object ВидРасчетаДополнительногоОтпуска {get;set;}//Вид расчета дополнительного отпуска
		[DataMember]
		[ProtoMember(24)]
		public decimal/*(15.2)*/ УдалитьРезультатКомпенсацииОтпуска {get;set;}//Не используется
		///<summary>
		///Процент оплаты
		///</summary>
		[DataMember]
		[ProtoMember(25)]
		public decimal/*(6.2)*/ ПроцентОплатыДополнительногоОтпуска {get;set;}//Процент оплаты дополнительного отпуска
		[DataMember]
		[ProtoMember(26)]
		public decimal/*(15.2)*/ УдалитьСторноРезультатКомпенсацииОтпуска {get;set;}//Не используется
		[DataMember]
		[ProtoMember(27)]
		public V82.Перечисления/*Ссылка*/.ПорядокРасчетаОтпуска ПорядокРасчетаКомпенсацииОтпуска {get;set;}//Порядок расчета компенсации отпуска
		[DataMember]
		[ProtoMember(28)]
		public decimal/*(5.2)*/ ДнейЧасовКомпенсацииОтпуска {get;set;}//Дней часов компенсации отпуска
		[DataMember]
		[ProtoMember(29)]
		public bool ИспользоватьСреднеЧасовойЗаработок {get;set;}//Использовать среднечасовой заработок
		[DataMember]
		[ProtoMember(30)]
		public V82.ДокументыСсылка.ПриемНаРаботуВОрганизацию УдалитьПриказ {get;set;}//Удалить приказ
		[DataMember]
		[ProtoMember(31)]
		public V82.ДокументыСсылка.НачислениеОтпускаРаботникамОрганизаций ПерерассчитываемыйДокумент {get;set;}//Перерассчитываемый документ
		[DataMember]
		[ProtoMember(32)]
		public DateTime РабочийГодС {get;set;}//Рабочий год с
		[DataMember]
		[ProtoMember(33)]
		public DateTime РабочийГодПо {get;set;}//Рабочий год по
		[DataMember]
		[ProtoMember(34)]
		public bool ОсновнойОтпуск {get;set;}//Основной отпуск
		[DataMember]
		[ProtoMember(35)]
		public bool ДополнительныйОтпуск {get;set;}//Дополнительный отпуск
		[DataMember]
		[ProtoMember(36)]
		public bool КомпенсацияОтпуска {get;set;}//Компенсация отпуска
		///<summary>
		///Дата начала расчетного периода
		///</summary>
		[DataMember]
		[ProtoMember(37)]
		public DateTime ПериодРасчетаСреднегоЗаработкаНачало {get;set;}//Период расчета среднего заработка начало
		///<summary>
		///Дата окончания расчетного периода
		///</summary>
		[DataMember]
		[ProtoMember(38)]
		public DateTime ПериодРасчетаСреднегоЗаработкаОкончание {get;set;}//Период расчета среднего заработка окончание
		///<summary>
		///(Общ)
		///</summary>
		[DataMember]
		[ProtoMember(39)]
		public string/*(40)*/ Фамилия {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		[DataMember]
		[ProtoMember(40)]
		public string/*(40)*/ Имя {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		[DataMember]
		[ProtoMember(41)]
		public string/*(40)*/ Отчество {get;set;}
		[DataMember]
		[ProtoMember(42)]
		public V82.СправочникиСсылка.ДокументыУдостоверяющиеЛичность ВидДокумента {get;set;}//Вид документа
		[DataMember]
		[ProtoMember(43)]
		public string/*(14)*/ СерияДокумента {get;set;}//Серия документа
		[DataMember]
		[ProtoMember(44)]
		public string/*(14)*/ НомерДокумента {get;set;}//Номер документа
		[DataMember]
		[ProtoMember(45)]
		public DateTime ДатаВыдачиДокумента {get;set;}//Дата выдачи документа
		[DataMember]
		[ProtoMember(46)]
		public DateTime ДатаДействияДокумента {get;set;}//Дата действия документа
		[DataMember]
		[ProtoMember(47)]
		public bool ПеречислятьПособиеПочтовымПереводом {get;set;}//Перечислять пособие почтовым переводом
		[DataMember]
		[ProtoMember(48)]
		public V82.СправочникиСсылка.Банки Банк {get;set;}
		[DataMember]
		[ProtoMember(49)]
		public string/*(20)*/ НомерЛицевогоСчета {get;set;}//Номер лицевого счета
		[DataMember]
		[ProtoMember(50)]
		public string/*(240)*/ АдресПочтовый {get;set;}//Адрес почтовый
		[DataMember]
		[ProtoMember(51)]
		public string/*(100)*/ НаименованиеБанка {get;set;}//Наименование банка
		[DataMember]
		[ProtoMember(52)]
		public string/*(9)*/ БИКБанка {get;set;}//БИК банка
		[DataMember]
		[ProtoMember(53)]
		public V82.СправочникиСсылка.ДолжностиОрганизаций ДолжностьУполномоченного {get;set;}//Должность уполномоченного
		[DataMember]
		[ProtoMember(54)]
		public V82.СправочникиСсылка.ФизическиеЛица Уполномоченный {get;set;}
		///<summary>
		///Корреспонденский счет банка
		///</summary>
		[DataMember]
		[ProtoMember(55)]
		public string/*(20)*/ КоррСчетБанка {get;set;}//Корр. счет банка
		[DataMember]
		[ProtoMember(56)]
		public string/*(0)*/ КемВыданДокумент {get;set;}//Кем выдан документ
		[DataMember]
		[ProtoMember(57)]
		public string/*(240)*/ АдресРегистрации {get;set;}//Адрес регистрации
		[DataMember]
		[ProtoMember(58)]
		public string/*(15)*/ Телефон {get;set;}
		[DataMember]
		[ProtoMember(59)]
		public string/*(30)*/ ТелефонСоставителя {get;set;}//Телефон составителя
		public void Записать()
		{
			//Установка блокировки элемента на горизантально масштабированный кластер.
			//Опционально введение тайм аута на запись одного и того же объекта, не чаще раза в 5-секунд. Защита от спама. упращение алгоритма блокировки.
			//Выделение сервиса для блокировки элемента и генерации кода
			//Выполнение операций контроля без обращений к sql-серверу.
			//Контроль конфликта блокировок.
			//Контроль загрузки булкинсертом гетерогенной коллекции.
			//Контроль уникальности кода для Документов.
			//Контроль уникальности номера для документов, в границах префикса.
			//Контроль владельца, он не может быть группой.
			//Контроль владельца он должен быть задан.
			//Контроль родителя он должен быть группой.
			//Контроль количества уровней, должен соотвествовать метаданным.
			//Контроль версии, объект не должен был быть записан перед чтением текущей записи, алгоритм версионника.
			//Контроль уникальности ссылки
			//Контроль зацикливания
			//Опционально контроль битых ссылок.
			//Соблюдейние транзакционности. ПередЗаписью. Открытие транзации. Валидации. ПриЗаписи. Фиксация транзакции. Информирование о записи элемента.
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					if(_ЭтоНовый)
					{
						Команда.CommandText = @"
						Insert Into _Document322(
						_IDRRef
						/*,_Version*/
						,_Marked
						,_IsMetadata
						,_Number
						,_Fld6309
						,_Fld6310RRef
						,_Fld6311
						,_Fld6312RRef
						,_Fld21589RRef
						,_Fld6313RRef
						,_Fld26847
						,_Fld6315
						,_Fld6316
						,_Fld21590
						,_Fld6317RRef
						,_Fld6318
						,_Fld6319
						,_Fld21591
						,_Fld6320RRef
						,_Fld6324
						,_Fld6321
						,_Fld6326
						,_Fld6322RRef
						,_Fld6323
						,_Fld18526
						,_Fld6314RRef
						,_Fld6325RRef
						,_Fld6327
						,_Fld6328
						,_Fld26848
						,_Fld26849
						,_Fld26850
						,_Fld26851
						,_Fld26852
						,_Fld26853
						,_Fld26854
						,_Fld26855
						,_Fld26856RRef
						,_Fld26857
						,_Fld26858
						,_Fld26859
						,_Fld26860
						,_Fld26861
						,_Fld26862RRef
						,_Fld26863
						,_Fld26864
						,_Fld26865
						,_Fld26866
						,_Fld26867RRef
						,_Fld26868RRef
						,_Fld26869
						,_Fld26870
						,_Fld26871
						,_Fld26872
						,_Fld26873)
						Values(
						@Ссылка
						/*,@Версия*/
						,@ПометкаУдаления
						,@Номер
						,@ПериодРегистрации
						,@Организация
						,@Комментарий
						,@Ответственный
						,@Сотрудник
						,@Физлицо
						,@ДатаНачалаСобытия
						,@ДатаНачалаОсновногоОтпуска
						,@ДатаОкончанияОсновногоОтпуска
						,@КоличествоДнейОсновногоОтпуска
						,@ПорядокРасчетаОсновногоОтпуска
						,@ДатаНачалаДополнительногоОтпуска
						,@ДатаОкончанияДополнительногоОтпуска
						,@КоличествоДнейДополнительногоОтпуска
						,@ВидРасчетаДополнительногоОтпуска
						,@УдалитьРезультатКомпенсацииОтпуска
						,@ПроцентОплатыДополнительногоОтпуска
						,@УдалитьСторноРезультатКомпенсацииОтпуска
						,@ПорядокРасчетаКомпенсацииОтпуска
						,@ДнейЧасовКомпенсацииОтпуска
						,@ИспользоватьСреднеЧасовойЗаработок
						,@УдалитьПриказ
						,@ПерерассчитываемыйДокумент
						,@РабочийГодС
						,@РабочийГодПо
						,@ОсновнойОтпуск
						,@ДополнительныйОтпуск
						,@КомпенсацияОтпуска
						,@ПериодРасчетаСреднегоЗаработкаНачало
						,@ПериодРасчетаСреднегоЗаработкаОкончание
						,@Фамилия
						,@Имя
						,@Отчество
						,@ВидДокумента
						,@СерияДокумента
						,@НомерДокумента
						,@ДатаВыдачиДокумента
						,@ДатаДействияДокумента
						,@ПеречислятьПособиеПочтовымПереводом
						,@Банк
						,@НомерЛицевогоСчета
						,@АдресПочтовый
						,@НаименованиеБанка
						,@БИКБанка
						,@ДолжностьУполномоченного
						,@Уполномоченный
						,@КоррСчетБанка
						,@КемВыданДокумент
						,@АдресРегистрации
						,@Телефон
						,@ТелефонСоставителя)";
					}
					else
					{
						Команда.CommandText = @"
						Update _Document322
						Set
						/*_IDRRef	= @Ссылка*/
						/*,_Version	= @Версия*/
						_Marked	= @ПометкаУдаления
						,_Number	= @Номер
						,_Fld6309	= @ПериодРегистрации
						,_Fld6310RRef	= @Организация
						,_Fld6311	= @Комментарий
						,_Fld6312RRef	= @Ответственный
						,_Fld21589RRef	= @Сотрудник
						,_Fld6313RRef	= @Физлицо
						,_Fld26847	= @ДатаНачалаСобытия
						,_Fld6315	= @ДатаНачалаОсновногоОтпуска
						,_Fld6316	= @ДатаОкончанияОсновногоОтпуска
						,_Fld21590	= @КоличествоДнейОсновногоОтпуска
						,_Fld6317RRef	= @ПорядокРасчетаОсновногоОтпуска
						,_Fld6318	= @ДатаНачалаДополнительногоОтпуска
						,_Fld6319	= @ДатаОкончанияДополнительногоОтпуска
						,_Fld21591	= @КоличествоДнейДополнительногоОтпуска
						,_Fld6320RRef	= @ВидРасчетаДополнительногоОтпуска
						,_Fld6324	= @УдалитьРезультатКомпенсацииОтпуска
						,_Fld6321	= @ПроцентОплатыДополнительногоОтпуска
						,_Fld6326	= @УдалитьСторноРезультатКомпенсацииОтпуска
						,_Fld6322RRef	= @ПорядокРасчетаКомпенсацииОтпуска
						,_Fld6323	= @ДнейЧасовКомпенсацииОтпуска
						,_Fld18526	= @ИспользоватьСреднеЧасовойЗаработок
						,_Fld6314RRef	= @УдалитьПриказ
						,_Fld6325RRef	= @ПерерассчитываемыйДокумент
						,_Fld6327	= @РабочийГодС
						,_Fld6328	= @РабочийГодПо
						,_Fld26848	= @ОсновнойОтпуск
						,_Fld26849	= @ДополнительныйОтпуск
						,_Fld26850	= @КомпенсацияОтпуска
						,_Fld26851	= @ПериодРасчетаСреднегоЗаработкаНачало
						,_Fld26852	= @ПериодРасчетаСреднегоЗаработкаОкончание
						,_Fld26853	= @Фамилия
						,_Fld26854	= @Имя
						,_Fld26855	= @Отчество
						,_Fld26856RRef	= @ВидДокумента
						,_Fld26857	= @СерияДокумента
						,_Fld26858	= @НомерДокумента
						,_Fld26859	= @ДатаВыдачиДокумента
						,_Fld26860	= @ДатаДействияДокумента
						,_Fld26861	= @ПеречислятьПособиеПочтовымПереводом
						,_Fld26862RRef	= @Банк
						,_Fld26863	= @НомерЛицевогоСчета
						,_Fld26864	= @АдресПочтовый
						,_Fld26865	= @НаименованиеБанка
						,_Fld26866	= @БИКБанка
						,_Fld26867RRef	= @ДолжностьУполномоченного
						,_Fld26868RRef	= @Уполномоченный
						,_Fld26869	= @КоррСчетБанка
						,_Fld26870	= @КемВыданДокумент
						,_Fld26871	= @АдресРегистрации
						,_Fld26872	= @Телефон
						,_Fld26873	= @ТелефонСоставителя
						Where _IDRRef = @Ссылка";
					}
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					/*Команда.Parameters.AddWithValue("Версия", Версия);*/
					Команда.Parameters.AddWithValue("ПометкаУдаления", ПометкаУдаления);
					Команда.Parameters.AddWithValue("Номер", Номер);
					Команда.Parameters.AddWithValue("ПериодРегистрации", ПериодРегистрации);
					Команда.Parameters.AddWithValue("Комментарий", Комментарий);
					Команда.Parameters.AddWithValue("ДатаНачалаСобытия", ДатаНачалаСобытия);
					Команда.Parameters.AddWithValue("ДатаНачалаОсновногоОтпуска", ДатаНачалаОсновногоОтпуска);
					Команда.Parameters.AddWithValue("ДатаОкончанияОсновногоОтпуска", ДатаОкончанияОсновногоОтпуска);
					Команда.Parameters.AddWithValue("КоличествоДнейОсновногоОтпуска", КоличествоДнейОсновногоОтпуска);
					Команда.Parameters.AddWithValue("ПорядокРасчетаОсновногоОтпуска", ПорядокРасчетаОсновногоОтпуска.Ключ());
					Команда.Parameters.AddWithValue("ДатаНачалаДополнительногоОтпуска", ДатаНачалаДополнительногоОтпуска);
					Команда.Parameters.AddWithValue("ДатаОкончанияДополнительногоОтпуска", ДатаОкончанияДополнительногоОтпуска);
					Команда.Parameters.AddWithValue("КоличествоДнейДополнительногоОтпуска", КоличествоДнейДополнительногоОтпуска);
					Команда.Parameters.AddWithValue("ВидРасчетаДополнительногоОтпуска", Guid.Empty);
					Команда.Parameters.AddWithValue("УдалитьРезультатКомпенсацииОтпуска", УдалитьРезультатКомпенсацииОтпуска);
					Команда.Parameters.AddWithValue("ПроцентОплатыДополнительногоОтпуска", ПроцентОплатыДополнительногоОтпуска);
					Команда.Parameters.AddWithValue("УдалитьСторноРезультатКомпенсацииОтпуска", УдалитьСторноРезультатКомпенсацииОтпуска);
					Команда.Parameters.AddWithValue("ПорядокРасчетаКомпенсацииОтпуска", ПорядокРасчетаКомпенсацииОтпуска.Ключ());
					Команда.Parameters.AddWithValue("ДнейЧасовКомпенсацииОтпуска", ДнейЧасовКомпенсацииОтпуска);
					Команда.Parameters.AddWithValue("ИспользоватьСреднеЧасовойЗаработок", ИспользоватьСреднеЧасовойЗаработок);
					Команда.Parameters.AddWithValue("УдалитьПриказ", УдалитьПриказ.Ссылка);
					Команда.Parameters.AddWithValue("ПерерассчитываемыйДокумент", ПерерассчитываемыйДокумент.Ссылка);
					Команда.Parameters.AddWithValue("РабочийГодС", РабочийГодС);
					Команда.Parameters.AddWithValue("РабочийГодПо", РабочийГодПо);
					Команда.Parameters.AddWithValue("ОсновнойОтпуск", ОсновнойОтпуск);
					Команда.Parameters.AddWithValue("ДополнительныйОтпуск", ДополнительныйОтпуск);
					Команда.Parameters.AddWithValue("КомпенсацияОтпуска", КомпенсацияОтпуска);
					Команда.Parameters.AddWithValue("ПериодРасчетаСреднегоЗаработкаНачало", ПериодРасчетаСреднегоЗаработкаНачало);
					Команда.Parameters.AddWithValue("ПериодРасчетаСреднегоЗаработкаОкончание", ПериодРасчетаСреднегоЗаработкаОкончание);
					Команда.Parameters.AddWithValue("Фамилия", Фамилия);
					Команда.Parameters.AddWithValue("Имя", Имя);
					Команда.Parameters.AddWithValue("Отчество", Отчество);
					Команда.Parameters.AddWithValue("СерияДокумента", СерияДокумента);
					Команда.Parameters.AddWithValue("НомерДокумента", НомерДокумента);
					Команда.Parameters.AddWithValue("ДатаВыдачиДокумента", ДатаВыдачиДокумента);
					Команда.Parameters.AddWithValue("ДатаДействияДокумента", ДатаДействияДокумента);
					Команда.Parameters.AddWithValue("ПеречислятьПособиеПочтовымПереводом", ПеречислятьПособиеПочтовымПереводом);
					Команда.Parameters.AddWithValue("НомерЛицевогоСчета", НомерЛицевогоСчета);
					Команда.Parameters.AddWithValue("АдресПочтовый", АдресПочтовый);
					Команда.Parameters.AddWithValue("НаименованиеБанка", НаименованиеБанка);
					Команда.Parameters.AddWithValue("БИКБанка", БИКБанка);
					Команда.Parameters.AddWithValue("КоррСчетБанка", КоррСчетБанка);
					Команда.Parameters.AddWithValue("КемВыданДокумент", КемВыданДокумент);
					Команда.Parameters.AddWithValue("АдресРегистрации", АдресРегистрации);
					Команда.Parameters.AddWithValue("Телефон", Телефон);
					Команда.Parameters.AddWithValue("ТелефонСоставителя", ТелефонСоставителя);
					Команда.ExecuteNonQuery();
				}
			}
		}
		public void Удалить()
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Delete _Document322
					Where _IDRRef=@Ссылка";
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					Команда.ExecuteNonQuery();
				}
			}
		}
	}
}